package com.caipiao.util;

import java.util.List;
import java.util.ArrayList;
import java.util.regex.Pattern;

/**
 * 字符串处理工具类
 * 提供常用的字符串处理方法
 */
public class StringUtils {

    private static final Pattern NUMBER_PATTERN = Pattern.compile("-?\\d+(\\.\\d+)?");

    /**
     * 检查字符串是否为空（null或空字符串）
     *
     * @param str 待检查的字符串
     * @return 如果为空则返回true，否则返回false
     */
    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    /**
     * 检查字符串是否不为空
     *
     * @param str 待检查的字符串
     * @return 如果不为空则返回true，否则返回false
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    /**
     * 检查字符串是否为空白（null、空字符串或只包含空白字符）
     *
     * @param str 待检查的字符串
     * @return 如果为空白则返回true，否则返回false
     */
    public static boolean isBlank(String str) {
        if (isEmpty(str)) {
            return true;
        }
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * 检查字符串是否不为空白
     *
     * @param str 待检查的字符串
     * @return 如果不为空白则返回true，否则返回false
     */
    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

    /**
     * 去除字符串首尾空白字符
     *
     * @param str 待处理的字符串
     * @return 去除首尾空白字符后的字符串
     */
    public static String trim(String str) {
        return str == null ? null : str.trim();
    }

    /**
     * 将字符串首字母大写
     *
     * @param str 待处理的字符串
     * @return 首字母大写后的字符串
     */
    public static String capitalize(String str) {
        if (isEmpty(str)) {
            return str;
        }
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }

    /**
     * 将字符串首字母小写
     *
     * @param str 待处理的字符串
     * @return 首字母小写后的字符串
     */
    public static String uncapitalize(String str) {
        if (isEmpty(str)) {
            return str;
        }
        return str.substring(0, 1).toLowerCase() + str.substring(1);
    }

    /**
     * 在字符串前添加前缀
     *
     * @param str 原始字符串
     * @param prefix 前缀
     * @return 添加前缀后的字符串
     */
    public static String prepend(String str, String prefix) {
        if (str == null) {
            return prefix;
        }
        return prefix + str;
    }

    /**
     * 在字符串列表的每个元素前添加前缀
     *
     * @param list 字符串列表
     * @param prefix 前缀
     * @return 添加前缀后的新列表
     */
    public static List<String> prependToList(List<String> list, String prefix) {
        if (list == null) {
            return null;
        }
        List<String> result = new ArrayList<String>();
        for (String str : list) {
            result.add(prepend(str, prefix));
        }
        return result;
    }

    /**
     * 统计字符串中某个子字符串出现的次数
     *
     * @param str 字符串
     * @param sub 子字符串
     * @return 出现次数
     */
    public static int countMatches(String str, String sub) {
        if (isEmpty(str) || isEmpty(sub)) {
            return 0;
        }
        int count = 0;
        int idx = 0;
        while ((idx = str.indexOf(sub, idx)) != -1) {
            count++;
            idx += sub.length();
        }
        return count;
    }

    /**
     * 判断字符串是否为数字
     *
     * @param str 待判断的字符串
     * @return 如果是数字返回true，否则返回false
     */
    public static boolean isNumeric(String str) {
        if (isEmpty(str)) {
            return false;
        }
        return NUMBER_PATTERN.matcher(str).matches();
    }

    /**
     * 将字符串转换为驼峰命名格式
     *
     * @param str 待转换的字符串
     * @param separator 分隔符
     * @return 驼峰命名格式的字符串
     */
    public static String toCamelCase(String str, String separator) {
        if (isEmpty(str)) {
            return str;
        }
        if (isEmpty(separator)) {
            return str;
        }
        String[] parts = str.split(Pattern.quote(separator));
        StringBuilder result = new StringBuilder(parts[0]);
        for (int i = 1; i < parts.length; i++) {
            result.append(capitalize(parts[i].toLowerCase()));
        }
        return result.toString();
    }

    /**
     * 将驼峰命名格式转换为下划线分隔格式
     *
     * @param str 驼峰命名格式的字符串
     * @return 下划线分隔格式的字符串
     */
    public static String camelToUnderline(String str) {
        if (isEmpty(str)) {
            return str;
        }
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isUpperCase(c)) {
                if (i > 0) {
                    result.append("_");
                }
                result.append(Character.toLowerCase(c));
            } else {
                result.append(c);
            }
        }
        return result.toString();
    }
}
